package com.iplay.thezen.memento.combinePrototype;

/**
 * 精简版本
 * 可能你要发问了，这和备忘录模式的定义不相符，它定义是“在该对象之外保存这个状 态”，而你却把这个状态保存在了发起人内部。
 * 是的，设计模式定义的诞生比Java的出世略 早，它没有想到Java程序是这么有活力，有远见，而且在面向对象的设计中，即使把一个类
 * 封装在另一个类中也是可以做到的，何况一个小小的对象复制，这是它的设计模式完全没有 预见到的，我们把它弥补回来。
 *
 * 考虑到原型模式深拷贝和浅拷贝的问题，在复杂的场景下它会让你的程序逻辑异常混乱，出现错误也很难跟踪。因此Clone方式的备忘录模式适用于较简单的场景。
 * 注意 使用Clone方式的备忘录模式，可以使用在比较简单的场景或者比较单一的场景 中，尽量不要与其他的对象产生严重的耦合关系。
 * @author dangwu
 * @since 2021/9/24 10:55 上午
 */
public class Originator implements Cloneable{
    private Originator backup;
    private String state = "";

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }
    public void createMemento(){
        this.backup= this.clone();
    }

    public void restoreMemento(){
        //在进行恢复前应该进行断言，防止空指针
        this.setState(this.backup.getState());
    }

    @Override
    protected Originator clone(){
        try {
            return (Originator)super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}
